package com.examlpe.cels.service.impl;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.examlpe.cels.dao.IBaseTermDao;
import com.examlpe.cels.dao.impl.BaseTermDaoImpl;
import com.examlpe.cels.entity.Vocabulary;
import com.examlpe.cels.entity.Word;
import com.examlpe.cels.exception.FileNotFoundException;
import com.examlpe.cels.service.IGameService;

public class GameServiceImpl implements IGameService{
	IBaseTermDao dao = new BaseTermDaoImpl();
	/**
	 *  此方法为了能够获取所有的单词和词汇，以Map集合的形式存储
	 *  1. isNew表示的是true，则从源数据中获取，即从BaseTermDaoImpl中获取
	 *  2. isNew表示的是false，则从如上的历史文件路径中读取内容
	 *  
	 *  Map的形式以key - value的形式组成，在这里都是String
	 *  	key 表示的是英文
	 *  	value表示的是中文
	 * @throws FileNotFoundException 
	 */
	//@Override
	public Map<String, String> en2cn(boolean isNew) throws FileNotFoundException {
		
		// 1. 创建一个Map集合，由于是乱序，所以使用HashMap集合
		Map<String,String> map = new HashMap<String,String>();
				// 2. 判断isNew为true，则从源数据获取
		if(isNew) {
//			File file = new File(IBaseTermDao.WORD_FILE);
			Set<Word> wSet = dao.getAllWords();
			for(Word w:wSet) {
				map.put(w.getEn(), w.getCn());
			}
			Set<Vocabulary> vSet = dao.getAllVocabularies();
			for(Vocabulary v:vSet) {
				map.put(v.getEn(), v.getCn());
			}
			
		}else {
			File file = new File(IGameService.EN_TO_CN_FILE);
			if(!file.exists()) {
				throw new FileNotFoundException("文件不存在");
			}
			map = dao.readFromFile(IGameService.EN_TO_CN_FILE);
			}
				// 2.1 从源数据中获取所有单词的Set集合

				// 2.2 从源数据中获取所有词汇的Set集合

				// 2.3 分别把单词和词汇的Set集合添加到Map集合中

				// 3. 判断isNew为false，则从历史数据中获取

				// 3.1 创建File对象，获取存储的历史路径data/history/en2cn.his

				// 3.2 判断文件是否存在，如果不存在，抛异常

				/*
				 *  3.3 判断文件是存在的，则直接调用dao中的readFromFile方法
				 *  		获取所有的Map集合，这个方法在BaseTermDaoImpl中的方法
				 */

				// 4. 返回当前的Map集合
		return map;
	}
	/**
	 *  此方法为了能够获取所有的单词和词汇，以Map集合的形式存储
	 *  1. isNew表示的是true，则从源数据中获取，即从BaseTermDaoImpl中获取
	 *  2. isNew表示的是false，则从如上的历史文件路径中读取内容
	 *  
	 *  Map的形式以key - value的形式组成，在这里都是String
	 *  	key 表示的是中文
	 *  	value表示的是英文
	 * @throws FileNotFoundException 
	 */
	//@Override
	public Map<String, String> cn2en(boolean isNew) throws FileNotFoundException {
		Map<String,String> map = new HashMap<String,String>();
		// 2. 判断isNew为true，则从源数据获取
		if (isNew) {
			// File file = new File(IBaseTermDao.WORD_FILE);
			Set<Word> wSet = dao.getAllWords();
			for (Word w : wSet) {
				map.put(w.getCn(), w.getEn());
			}
			Set<Vocabulary> vSet = dao.getAllVocabularies();
			for (Vocabulary v : vSet) {
				map.put(v.getCn(), v.getEn());
			}
	
		} else {
			File file = new File(IGameService.CN_TO_EN_FILE);
			if (!file.exists()) {
				throw new FileNotFoundException("文件不存在");
			}
			map = dao.readFromFile(IGameService.CN_TO_EN_FILE);
		}
		// 1. 创建一个Map集合，由于是乱序，所以使用HashMap集合

				// 2. 判断isNew为true，则从源数据获取

				// 2.1 从源数据中获取所有单词的Set集合

				// 2.2 从源数据中获取所有词汇的Set集合

				// 2.3 分别把单词和词汇的Set集合添加到Map集合中

				// 3. 判断isNew为false，则从历史数据中获取

				// 3.1 创建File对象，获取存储的历史路径data/history/cn2en.his

				// 3.2 判断文件是否存在，如果不存在，抛异常

				/*
				 *  3.3 判断文件是存在的，则直接调用dao中的readFromFile方法
				 *  		获取所有的Map集合，这个方法在BaseTermDaoImpl中的方法
				 */

				// 4. 返回当前的Map集合
		return map;
	}
	/**
	 *  持久化没有被用户所答的词汇和单词，如果en2cn为true，保存在en2cn.his
	 *  否则保存在cn2en.his中
	 * @throws FileNotFoundException 
	 */
	//@Override
	public void saveGameHistory(Map<String, String> map, boolean en2cn) {
		// 1. 先判断父目录是否存在，如果不存在，则创建父目录
		
//		if (IGameService.HISTORY_DIR == null) {
//			File file = new File(IGameService.HISTORY_DIR);
//		}
		File dir = new File(IGameService.HISTORY_DIR);
		if(!dir.exists()) {
			dir.mkdir();
		}
		// 2. 确定目录文件
		String file = "";
		if (en2cn) {
			file = EN_TO_CN_FILE;
		} else {
			file = CN_TO_EN_FILE;
		}
		try {
			dao.writeToFile(map, file);
		} catch (FileNotFoundException e) {
			System.out.println("写入文件失败");
		}
				// 3. 如果en2cn为true，则文件为EN_TO_CN_FILE
				
				// 4. 如果en2cn为false， 则目标文件为CN_TO_EN_FILE
				
				// 5. 调用dao中的writeToFile方法完成持久化操作
	}

}
